@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr  }1050 DISK DIAGNOSTICCopyright 1983 Atari,Inc.SET DISK DRIVE NUMBER TO 1LEAVE DIAGNOSTIC DISKETTE IN DRIVE-P}RESS WHEN READYExecuting MPU & Controller TestsˠŠ̠Ԡ-VERIFY CONNECTIONS,TURN DRIVE OFF/ON-VE}RIFY DRIVE #,P !RESS WHEN READYCONTROLLER TEST ӛDRIVE STATUS CHECK ӛExecuting Invalid Command TestDRIVE} INVALID COMMAND TESTTesting Continues....DRIVE INVALID COMMAND TESTExecuting Write Protect TestDRIVE WR}ITE PROTECTEDDRIVE !" WRITE PROTECTEDMOTOR START TEST ӛMOTOR START TEST ,Executing Motor Start TestExecutin }g Head Step/Settle Test Executing Motor Speed Test MOTOR SPEED IS MSMOTOR SPEED TEST ӛ堲 }ӠӛExecuting"# Motor Speed TestMOTOR SPEED -ϠțMOTOR SPEED -ϠכSTEP/SETTLE TEST ӛSTE }P/SETTLE TEST ӛExecuting Track 00 Sensor TestTRACK 00 SENSOR TEST ӛTRACK 00 SENSOR TEST ӛ ŠԠ }ġ FD100026Press #$ when ready6) ERROR PRINTOUT7) TRACK ZERO SENSOR CALIBRATIONEnd of Diagnostic Tes }ting---Do You Want to Run Diags (1) orGo to Troubleshooting Options (2)?Enter Choice Troubleshoot}ing Options CHOICES ARE:1) LOOP ON S$%PEED CALIBRATION2) RUN MANUAL ALIGNMENT TESTS *** USE DYMEK DISKETTE3) DRIVE S}ELECT SWITCH TEST4) SINGLE DENSITY BURN-IN 10 MIN *** USE PRE-FORMATTED DISKETTE5) DOUBLE DENSITY BURN-IN 2 HOUR **}* USE WORK DISKETTE0=TRK0,1=TRK16,2=TRK33,3%&=TRK34RETURN FOR MENUSET SWITCH TO 1,PRESS RETURNSET SWITCH TO 2,PRESS RET}URNSET SWITCH TO 3,PRESS RETURNSET SWITCH TO 4,PRESS RETURNDRIVE SELECT TESTŠŠϠԠȠϠDRIVE SELECT} TEST ӛWriting E5 Pattern to DiskWRITE TEST&' ӛWRITE TEST ӛREAD TESTREAD TEST ӛREAD TEST ӛ}Πқ Be Single Density Diskette!Press to AbortBreak Will Cause Fail Press to AbortPress} to Abort]''  01234567k(f) ~; ;} ; D 3 3 3 /TQ$ 3q}$ 3 I2$ 3BDEH V' 'L(L*1 3L 3p 3 3 0 3S Y+ɊLT) I2 3 I2}Ʃ 3 3 I2 3L()! 3! 3 I2Le)! 3! 3 I2 g)b*0C! 3  Yɋb! 3! 3L)! 3! 3 / I}2! 3S S)ة! 3! 3L)! 3! 3 / I2:" 3 0 Y$@ Y# " 3! 3L#*#" 3}! 3 ?0 / I2 0U" 3 Y9# 3! 3Li*P# 3c*^+! 3 / I2h# 3 0' 1' 1 1 2 1} 1 2' # 3L*# 3 I2 /4$ 3 I2Q$ 3q$ 3$ 3 /L. / 3$ 3ҩ$ 3 I2$ 3 I2$ 3% 3 }I25% 3 I2Q% 3s% 3 I2% 3% 3 I2$ 3 I2$ 3 I2 / /_++$ 3L.L* Dک Dڭԭ ( ؠ}0L+)ȩ`+, /L+L*#Щ% 3% 3$ 3_' 3D'EHIB V''''}'ɛ7L+L.,L.,!L.," 0 YɀɛL1,L+L*% 3 3S S ɀ4 /Lv,LH, /& 3 3}S S ɀ\ /L,-,L, /9& 3 3S S ɀ. /L, /V& 3 3S S/ɀ /&} 3' / / / /'L*& 3' / / / /' /L*Q% 3s% 3٩# 3 I2p 3 I2_' 3t' 3 3}'L- G/& 3 I2W-.    S& 3% 3 3L*m  m   ʭ } L-ک& 3 I2& 3 I2' R   S' 3% 3 3L* /m  m   !} L7.' 3 I2 /L*DE./HIB V'!'"'#'$'%'&''L* 3L+ 3L+ 3LH, 3LG- "}3L2 3LH5 3Lo:L*DEHIB V' 'L*L* I2 I2$ 3 / / / I2L( 0'' s10 ɐ#}'`h'4>' 3# 3 3'HLG/ I2/0# 3 I2 / / /LG-s& 3 I2`& 3`' (' 3 I2L*L/`$}` / 0 Tu" 3 Tɩ" 3T" 3 Y$@ Y j+TU 3T' 3` / I2 0" 3 Y$%}@ Y8''8''" 3!01 3`# 3! 3` # 3! 3`1Ѝ  `1&}#   `' /1 Q1'i'i' 8'8``''0' s1'''`'}''0' s1'''` 1@R12  Y`S S0''' 1'm' 'i(} `N'm'Jn''`' 2S S) ' ''` 0 Y`'' s1 .2`S SɀLE2Ɋ`hL)}*# 3` BURNIN TEST - INSERT FD100053 -Input Unit Seri23al NumberLeading Zeros Be EnteredTen (10) Digits Requ*}ired PRESS WHEN READYQ2 3Ʃ2 3 3 I2v2 32 32 3 _3 0 ' +}  # YL*HIBD'E V33IH  '`L233DEPH,}I B V`33HIBDE Vɛ`33 3`NYA5<6P: 5 5C5'B5 ]6 6 6''(-}B5 7 7 7L* I6 I6 I6 7 7 7`A5` 3+9 3BD'EHI V'33L5 6hL*rDt.}5uzN{0 Vs #6hL*A5` r VB5` r V I2I9 3 / /=687 / I2B5` rxyL!7' /}s1 I2f9 3 / / / / 6hL*A4' s1Ll64`C5A43Ȋi3`C5 :70}3`3G5JJJ'B5 7 8 Y83L6t4ux y rA5 0 Vs #6hL*9748` I6 I6 I6 7 7A441} 7 I6C5 7 7 DڭK4ԭL4 آ 8 7 7 7 DڭM4ԭN4 آ 8 7LI6'4 04L7`' 9轂92}'4L7` 7 7' 8 8 7L 7 7 7' 8 8 7G5A4 9 7G55809A4)` 7 7G5A4 3}8 8L 7 I6 7 7 7 7 7 7 7G5G5A4 8 8G5G5A4 8 8G5G5A4 8 8G5G5A4 8 8G5G5A44} 8 8G5A4 8 8 7 I6`04L8)4`H Dh LH$4hHJJJJ 9h)ii@؝4`Printe19,:r Online & Ready? (Y5}/N)Printer Error, Check PrinterDisk Read Error, Check Disk99999999:0:?:Y:SERIAL I.D. =TRACKNO ERRORS-ALL TRACKS6}- ERRORSSECTORERROR STATUS =DATA BYTE LOCATION =DATA DATA DATA DATA SEEK RNFCRC LOST HARD SO-:n:FTPASS COUNTE7}R =1050 BURN-IN (2HR), REV.APASS COUNT RECEIVED =o:j;; 31; 3p 3' 3 3'' s1 1'' 1 1 8}2 1 1' `; 3L: q; 3L:h; 3 2 2 2 2ДL*L; 3 / / / /L*Track Zero Sensor Calibration9}Insert Diagnostic DisketteԠĠˠěk;|;ěSensor OK!!};; L((k(CCCCCCCCCCCCCCCCCCCCCCCCCCC:}CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC;}00000000.450<}F?7  =}+8<<  B JKIHiDiELV`L8 8 BLV`Lx?}8t8l Lu8hihiHHȱȱL8c !#3`Lu8JJJJ`H 8h`H@}ȩh Q8L8 Z8L8 8L8 8L8 8L8S:@9E:E9H '9 H9I9 8 '9h)0ICA}9D9L8 L :::: :Lr:::IEL[::i:iIIL[:`:i::iC}::L:`L{:w:w: C`L:L: D8:MEM.SAV: 8| 9 '9`L:L: D:DUP.SYS:̩ 8D} x:ɀL: '9`88 |9Y:X: '9L); D8:DUP.SYS; 8::88 9 '98? :`;WL`; 9E}Ln; ` :Y;Y;L;L;)} Setting Up ATARI 130XE Ram Disk; 9L; ; -9  F} L;D8:; :9 :Y;L=pp">=Jp֩00=M)|MӍӽ=p=Jp<=M)|MӍӽ>Y}p">ph r;Computer is: <J r;128K - 130XE (64K)LF9 r;800XL unmodified-- No RAM Disk Installed` < r;Z}192K - 130XE (128K)LF9 r;256K - 800/1200XL (192K)LF9 r;320K - 130XE (256K) i? ɛ& r;-- No Drive Number Specifi[}ed`L iw9 ix9 v92" )= v9<$ /ȱ ɛ-E q> ; 8 2 32;]}2ȱ2;;2 ;,y90` r; H<]=)|MӍөBA@*G;@<8<"; @@ ^} @@N@,<8< @ @iA6;Ah`MAIN L0 RAM-DISK_}"h;h;;; ;Lz;;H;H`HI BLV >`1=Lxԭ45S`}4?g:q:x:;<<<<;;<<< <8<= &? m6?L> &? ?m6?m7?L>5?>>?d}?>?5?i 5?Lv>??` ? ?`2>;;j ?m6?m7?L>5?>>?U@tH 0JJ0DJEBJK V0a0PDaEHIB V0A0ĝDEHIB V0!Jf}0J1J6`010 B VPBJDJE V 8DJ2Щ)ꭄJg}J01{J 0M 8D|JJ |J 0M 8D}J 8D~J$ 8DJ JJJJ 8DrJx 8D C1{J{Jh}{JL@2J|J|J|JL@3 }JI}JL@4 ~JI~JL@5J JJJL@6 JI JL@7LdA{Ji} 0K~ 8DЭ)LUC C|J ~J }JJJJi H JJJJhJq j}J  JJJJ  ȌJJJJMEMEMEME{J 0@KDKEJB VJLC@ k}B DFErHI VJLC@ B V oDP B V䭀J J  vC ʅ(mJ{J 0JmJJlJP B V0 Bl} V@ B Vl NթԥR$ԅȱԅmJiԥiL~C3mJ{`Pm}BHI VLUC` 8DUKTKJ) 0:iNJJJJJ 0:iN 8D 8D CLUCHHHKHKIKDKE BKn}UKT Vhhh`ԩDՠJDE E8Fԅ Dԅ DԍJ DԍJ Dԑ̓J DLD͂JF` DLDo}``    L&PRL8|L@!   LYLS `?ױPבp}Ȣ`|`Y䍤L#L0LKEMDE(SD) XXK 800 PLUS V2.0 (c) 1983 by STACE && ('' q}(((ERR-Not V2 Disk 2`L 22334,, (a(j(@j" B V@jB(E_D VP@Pנr}PP٢`E:(@@R PWL@   ngL@&LC@)J @js}&0PLP٭)$h8hmiL1@Lb(+t}8)))ύ )) )))5 )H))(hN(j)=))8 ) )))L}()ש)  u}h W @L!*v}HRD1:DUP.SYSDN:DUP.SYS )L +0BJ D*E VL*@Bw}J 0*D*E VL*0@B BDD+EE0QHI V *@0HHIIH V0 *Ɉ *0 *L + x}*0!BD*E VL +0 B V@ B V`DN:MEM.SAVE)w@B 0+D+EJ VLk+@ B|DEHy}I V0@ B V+<L+@ B V@!BD+E V`b((*06}z}:@jkqqqqqqqqqqjklmnqqqqqqq  @K:D1:VDOSFIL1DN:AUTORUN.SYS=L M M M M {}M M M M M M M M M M M M M M M M]K L#LMN}|}EMDE installation startedPut your system disk in drive 0.Press Ԡ to continue.Error extending DUP.SYS Error writi}}ng AUTORUN.SYS } Install E M D E - Ver. 2 by stace For 800 PLUS MEMORY MOD (c) 1983, Stace ~} 1 - System Disk --------- 2 - Virtual Disk -------- 3 - Use Virtual DUP.SYS - 4 - Use Virtual MEM.SAV - } 5 - Memory size --------- 6 - Virtual Disk Density- 7 - Press the number key next to the}parameter to be changed.12No Yes 64K 80K 96K112K128K144K160K176K192K208K224K240KSNGLDBL $00Press RETURN for DOS^}gX Z \ ^ ` b d f h j l n p r t ! ! !:!=!@!C!H!K!T!W!\!a!g!j!o!r!u!!!!!!!!!!!!!!!!!}"" """""*"/"2";"N"T"["h"w"z"""""""""""""""""""""""""y#|####################$ $} $$$$+$2$;$D$H$O$Z$^$a$d$o$u$x$$$$$$$$$$$$$$$$$$$$$$$$$$$%)%,%/%@%C%V%]%`%c%p%s%w%z%%%%%%%}%%%%%%%&&&"&(&.&3&6&8&;&>&A&D&N&Q&r&|&&&&&&&&&&&&&&& '''M'P'S'V']''''''''''''''''''}((((1()(7(:(=(B(I(V([(](h(q(t(((()) ))))))0)?)C)F)L)q)t)w))))))))1*<*A*D*G*L*Y*^*a*d*g*j*m*p*u*z*}***}***************++ + +++++!+$+'+*+-+3+6+9+<+D+J+P+S+V+Y+\+_+b+e+m+s+v+y+|+++++++++++++++++}+++,,,[,^,c,f,i,l,q,t,,,,,,,,,,,,,,,,,-"-%-(-/-2-4-9-<-?-B-I-N-]-b-e-t-z---------------}. ......+./.4.7.:.=.@.H.K.O.R.U.f.q.v.y.~....................... / ////:/A/F/I/Q/Y/f/o/r/y////}/B0J0M0P0S0V0c0|00000000000000000000000001 1111#1)1,1/14191?1H1K1b1e1k1n1q1t1111111111}112 2 222(2-202326292D2L2O2U2X2[2a2d2g2l2o2t222222222((6``pppOPa}Op}A6`@OpyAVMREMIVMADS }@ S."D:EMDIAG.ADR J'(} Ġ٠*(G( Ҡ J( '$( }ǠҠ'( $!( by David G. Byrd$(G6-BP@6-'6-36-G+A},@d.*(!HOW MANY 16K BANKS TO TEST (0-15).e(INPUT STEP SIZE iP(<( I WILL TAKE A0$'} SECONDS FOR EACH PASS?(P( TEST RUNNINGn# )!@# AMEMORY WRITE ROUTINE - +,}" 6-,-Bc%B'g6 +,8)6-%@"AQ)6-@ J MMEMORY READ ROUTI}NEO -U +,Y 6-[''POKE (16347),0:REM * FORCED ERROR^-Bc%B'gh 6-F:,r  A}|)6-%@"AQ)6-  END OF PASS ROUTINE06-%@0( PASSES-} ERRORSXb "6-#6-%@O( COMPLETED  TESTS WITH  ERRORSb(STARTING AGAIN  A} MEMORY ERROR PRINT ROUTINE6-%@ 6-F:,88(BK -ADR -RD -WR -DIF O:&,$} D:EMDIAG.ADRPRINT ROUTINE6-%@ 6-F:,88(BK -ADR -RD -WR -DIF O:&,$mAVMREMIVM }S."D:EMDIAG.DAT J'(} Ġ٠*(G( Ҡ J( '"( Ԡ }Ҡ'( $!( by David G. Byrd$(G6-BP@6-'6-36-G+A,@ }d.*(!HOW MANY 16K BANKS TO TEST (0-15).e(INPUT STEP SIZE i<(<( I WILL TAKE Ae$' SECONDS FOR } EACH PASSn# )!@# A9 A " B9(TEST RUNNING WITH DATA=MEMORY WRITE ROUT }INE - +,,-Bc%B'g6 +,@ J MMEMORY READ ROUTINEO -U +, }[))POKE (16384),128:REM * FORCED ERROR^-Bc%B'gh 6-F:,r  A  END OF }PASS ROUTINE06-%@0( PASSES- ERRORSX] "6-#6-%@P( COMPLETED  TESTS WI }TH  ERRORSS(] AP  A MEMORY ERROR PRINT ROUTINE6-%@ 6-F:,88(BK - }ADR -RD -WR -DIF O:&,$0,85,170,255 D:EMDIAG.DAT6-%@ 6-F:,88(BK - TX;SAVE#D:ATARIRAM.SCRX;ASM,,#D:XLRAMDSK.EXE ,X;RAMDISK CONTROLLER FOR 256K ATARI 800XL#X; by Claus Buchholz, Dec$}., 1984X;("X; OPTIONS: Drive # and density2X;< DRIVEFDENSITYSINGLEPX;Z X; EquatesdX;nSINGLE;;Secto$}r lengthsx DOUBLE(DDEVIC;;SIO Device Control Block DUNITDCOMNDDSTATSDBUFLODBYT$}LO DAUX1 -DOSINI ;;Access to RESET initialization"CHKSUM1;; Temporary checksum2BUFRLO2;; Temporary p$}ointer to user's buffer*ZTEMP4;; Temporary miscellaneous use"STACKP;;Stack pointer save4PORTB;; PIA port B$} - memory control registerX;'X; Load-time code - Copy OS into RAMX;"0,GO6QPORTB;Enable OS ROM@L>J PP$}ORTBTQ>;Zero page pointer^PhQ>rP|=;;Disable interruptsPԐ?LOOPQ@7;;Copy OS"PORTB;Enable$} RAMP@7#PORTB;Enable ROM3 HLOOP$(>;Skip pages $CC to $D7 HNXPG$>NXPG2&& HLOOP0$}"PORTB;Enable RAM:Q>@;Enable interruptsDPN.X:;Continue loadbl* GO;Execute preliminary load-time codev$}X;X; Ramdisk controller codeX;3;Permanent code - in place of alt. char. setHOOK,;Hook into all SIO calls$} QDDEVIC ODUNIT"R>1DRIVE;Right drive number? FHOOKEDOLDVEC ! ;If not, go to SIO HOOKED@;If so, $}intercept&STACKP;Save stack pointer QDCOMND;Examine commandR> !;Format?  HNOFMT* !FORMAT4 NOFMT>R> P;Put se$}ctor?H HNOPUTR !PUTSEC\ NOPUTfR> R;Read sector?p HNOGETz !GETSEC NOGETR> S;Read status? HNOSTT !STATU$}S NOSTTR> W;Write sector? HNAKRET !PUTSECX;EX; Returns - Restore stack pointer, report error status and retu$}rnX; NAKRET $STACKPB&%>;NAK error for improper command 'DSTATS$:. ERRRET8 $STACKPBBL%>;Bad sec$}tor errorV 'DSTATS`:j SUCRETt $STACKP~B%>;No error 'DSTATS:X;-X; Subroutine - Set pointer to user b$}ufferX; SETBUF&QDBUFLO;Move from DCB to zero page PBUFRLOQDBUFLOPBUFRLO:X; 6X; Subroutine - $}Prepare to access sector of ramdiskX; SETSEC( Q>DENSITY2PSECLEN;Set sector length<QDAUX1;Check sector #F H$}NOTZP QDAUX1ZFOUTRG;Sector 0 invaliddR>n EINRNGx)Q>;Sectors 1-3 always 128 bytes long PSECLEN HINRNG O$}UTRG!!NAKRET;Sector # out of rangeNOTZ!R>;Check for sector # > $2D0 DINRNG HOUTRGQ> RDAUX1 DOUTRG$} INRNGQDAUX1;Sector # valid %DAUX1$> DIV121"<2;Divide # by 121 - Result is bank #, remainder is page #,$};6S>y@ ENOBORJ1T NOBOR^)>h HDIV121rM>;Remainder+7|X;+X; Subroutine - Prepare to switch banks:X; X$} is bank #, A is page #X; SETBNKPZP;Save page # QPORTBPPBN;Normal bankM>PPB;Bank 0AT?T?$}T?T?LPBPPB;Bank X&Q;NMI vector0 PZTEMP:QD PZTEMPN%>XQ>@;RTI opcodeb=;Disable IRQl4P@ZT$}EMP7;Place RTI in NMI routine - disables NMIvQPBPPORTB;Switch bank inCP;Set up zero-page pointerQZPP$}QPBN%PPORTB;Switch normal bank back in:;Leave 0 in Y, bank # in XX;X; Format routineX; FORMAT$>;Cle$}ar banks 0 to 5 CLOOP1 Q>;Clear page 2 and up SETBNK;Prepare for switch QPB*PPORTB;Switch bank in4C> CLO$}OP2HP@7;Zero entire pageR3\ HCLOOP2f#;Next pagep ICLOOP2zQPBNPPORTB;Switch bank outQNMIP@ZTEMP7;$}Enable interrupts.0;Next bank ICLOOP1 SETBUF3Q>;Return a sector with 2 $FFs and the rest 0s%> FLOOP$})> HNOTFFQ> NOTFF P@BUFRLO7 3$ )SECLEN. HFLOOP8 !SUCRET;DoneB X;L X; Write sector routineV X;` $}PUTSECj SETBUFt Q>~ PCHKSUM;Zero checksum # SETSEC;Point to ramdisk sector PLOOP )Q@BUFRLO7;Get byte from u$}ser's buffer $PB &PORTB;Switch bank P@7;Put byte into ramdisk $PBN &PORTB;Normal bank , OCHKSUM;Add byte$} to checksum PCHKSUM 3;Next byte )SECLEN;Proper sector length HPLOOP #$>;Bank 0 holds checksum table QDAUX1$}( ,2 'O>;Sector # indexes checksum table< SETBNKF %DAUX1P QCHKSUMZ $PBd &PORTB;Switch bankn P@7;Store chec$}ksumx $PBN &PORTB;Normal bank %> QNMI P@ZTEMP7;Enable interrupts . !SUCRET;Done X; X; Read sector rou$}tine X; GETSEC SETBUF Q> PCHKSUM;Zero checksum SETSEC GLOOP $PB" &PORTB;Switch bank, Q@7;Get b$}yte from ramdisk6 $PBN@ &PORTB;Normal bankJ )P@BUFRLO7;Put byte into user's bufferT ,^ OCHKSUM;Add to checksumh PCH$}KSUMr 3;Next byte| )SECLEN;Proper sector length HGLOOP !$>;Bank 0 for checksum table QDAUX1 , O> SET$}BNK %DAUX1 $PB &PORTB;Switch bank Q@7;Get original checksum $PBN &PORTB;Normal bank > %> QNMI P$}@ZTEMP7;Enable interrupts& .0 (CHKSUM;Compare checksums: FGCSOKD $!ERRRET;If different, bad sectorN GCSOKX !SUCRET$};If same, doneb X;l X; Read status routinev X; STATUS SETBUF %>;Return 4 bytes Q>;All 0s SLOOP 1 FS$}TEND P@BUFRLO7 !SLOOP STEND FLAGDENSITY Q> FLAG /P@BUFRLO7;First byte tells density of drive !SUCR$}ET;Done X; X; Variable storage area X;* 2ZP ;Holds page # in ramdisk to be accessed4 >PB ;Value of memory con$}trol register for selected bank> =PBN ;Value of memory control register for normal bankH >NMI ;First opcode in NMI $}routine - Used to restore NMIR (SECLEN ;Length of current sector\ X;f "X; RESET initialization routinep X;z ;Hidd$}en (hopefully) NEWINI "PORTB;Enable RAM OS OLDINI  " ;Call original DOSINI routine MODINI 'Q>NEWINI;Se$}t hook for next RESET PDOSINI Q>NEWINI PDOSINI : X; &X; Load-time code - Install ramdisk X;0$}DO QZ;Save original SIO vector$ POLDVEC.Q[8POLDVECB$Q>HOOK;Install new SIO vectorLPZVQ>HOOK`$}P[j(Q;Save first opcode in NMI routinetP~QP̒%>Q@7PNMI'QDOSINI;Save original DOSINI vecto$}r POLDINIQDOSINIPOLDINI MODINI;Install new one1 ;Re-initialize FMS to show ramdisk present :;Done$}$ DO;Execute final load-time code MODINI;Install new one1 ;Re-initialize FMS to show ramdisk present :;Done$+080 ө̩xԨӑө@X`0m5L ̺!LPLRLkSLW(}Lͮ```23`ͭ   L8   8y)ͭӍ)͊ (} ͍ͭ45@x4͍Ә͍ͅ` ̭͍Ә͍ͭ͑4X V̩2LL V̩1 a̱2(}͎ӑ͎e11 i ̬ 1͎ӑ͎Ӡ͑4XLL V̩1 a̮͎ӱ͎ӑ2e11 i ̬ ͎ӱ(}͎Ӫ͑4X1LBLL V̠2Lͩ2LL   `070Z ̭[ ̩Z̍[˭̠ˍͥ    `(}0͑4X1LBLL V̠2Lͩ2LL   `070Z ̭[ ̩Z̍[˭̠ˍͥ    `( ******************************* * RAM-DISK CONTROLLER FOR THE * * QUARTER-MEG ATARI 800XL * ******************,}************* RD.SRC and RD2.SRC are identical copies of the source code for the RAM-disk controller. They include line,} numbers, unlike the BYTEnet listing ATARIRAM.ASM. RDS.OBJ is already assembled. It is a load-and-go file which can be r,}enamed AUTORUN.SYS for automatic booting. RDS.OBJ sets up a single-density RAM-disk as drive #2. RDD.OBJ is the same, exce,}pt it sets up a double-density RAM-disk as drive #2. To use other drive numbers, you must change one line in the source c,}ode and reassemble. Remember, you must format the RAM-disk after loading the controller and before using it. In BASIC, u,}se XIO 254,#1,0,0,"D2:". Otherwise, format it from DOS. Enjoy!loading the controller and before using it. In BASIC, u,D@8@ ө̩xԨӑө@X`@m3L ̺!LPLRLkSLW0}Lͮ```23`ͭ   L8   8y)ͭӍ)͊ 0} ͍ͭ45@x4͍Ә͍ͅ` ̭͍Ә͍ͭ͑4X V̩2LL V̩1 a̱20}͎ӑ͎e11 i ̬ 1͎ӑ͎Ӡ͑4XLL V̩1 a̮͎ӱ͎ӑ2e11 i ̬ ͎ӱ0}͎Ӫ͑4X1LBLL V̠2Lͩ2LL   `@7@Z ̭[ ̩Z̍[˭̠ˍͥ    `0}@͑4X1LBLL V̠2Lͩ2LL   `@7@Z ̭[ ̩Z̍[˭̠ˍͥ    `00100 ; RAMDISK CONTROLLER FOR 256K ATARI 800XL0110 ; by Claus Buchholz, Dec., 19840120 ;0130 ; OPTIONS: Drive # and densit4}y0140 ;0150 DRIVE = 20160 DENSITY = SINGLE0170 ;0180 ; Equates0190 ;0200 SINGLE = $80 Sector lengths0210 DOUBLE = 4}$000220 DDEVIC = $0300 SIO Device Control Block0230 DUNIT = $03010240 DCOMND = $03020250 DSTATS = $03030260 DBUFLO = $04}3040270 DBYTLO = $03080280 DAUX1 = $030A0290 DOSINI = $0C Access to RESET initialization0300 CHKSUM = $31 Temporary4} checksum0310 BUFRLO = $32 Temporary pointer to user's buffer0320 ZTEMP = $34 Temporary miscellaneous use0330 STACK4}P = $0318 Stack pointer save0340 PORTB = $D301 PIA port B - memory control register0350 ;0360 ; Load-time code - Copy O4}S into RAM0370 ;0380 *= $40000390 GO0400 LDA PORTB Enable OS ROM0410 ORA #10420 STA PORTB0430 L4}DA #$C0 Zero page pointer0440 STA $CC0450 LDA #00460 STA $CB0470 SEI Disable interrupts0480 4} STA $D40E0490 TAY 0500 LOOP0510 LDA ($CB),Y Copy OS0520 DEC PORTB Enable RAM0530 STA ($CB),Y0540 4} INC PORTB Enable ROM0550 INY 0560 BNE LOOP0570 LDX $CC0580 CPX #$CB Skip pages $CC to $D70590 4} BNE NXPG0600 LDX #$D70610 NXPG0620 INX 0630 STX $CC0640 BNE LOOP0650 DEC PORTB Enable RAM0660 4} LDA #$40 Enable interrupts0670 STA $D40E0680 CLI 0690 RTS Continue load0700 *= $02E207104} .WORD GO Execute preliminary load-time code0720 ;0730 ; Ramdisk controller code0740 ;0750 *= $CC00 Permane4}nt code - in place of alt. char. set0760 HOOK0770 CLC Hook into all SIO calls0780 LDA DDEVIC0790 ADC 4}DUNIT0800 CMP #$31+DRIVE Right drive number?0810 BEQ HOOKED0820 OLDVEC = *+10830 JMP * If not, go to SI4}O0840 HOOKED0850 TSX If so, intercept0860 STX STACKP Save stack pointer0870 LDA DCOMND Examine comm4}and0880 CMP #'! Format?0890 BNE NOFMT0900 JMP FORMAT0910 NOFMT0920 CMP #'P Put sector?0930 4}BNE NOPUT0940 JMP PUTSEC0950 NOPUT0960 CMP #'R Read sector?0970 BNE NOGET0980 JMP GETSEC0990 NOGET4}1000 CMP #'S Read status?1010 BNE NOSTT1020 JMP STATUS1030 NOSTT1040 CMP #'W Write sector?1050 4} BNE NAKRET1060 JMP PUTSEC1070 ;1080 ; Returns - Restore stack pointer, report error status and return1090 ;1100 N4}AKRET1110 LDX STACKP1120 TXS 1130 LDY #139 NAK error for improper command1140 STY DSTATS1150 RTS 4}1160 ERRRET1170 LDX STACKP1180 TXS 1190 LDY #144 Bad sector error1200 STY DSTATS1210 RTS 1220 S4}UCRET1230 LDX STACKP1240 TXS 1250 LDY #1 No error1260 STY DSTATS1270 RTS 1280 ;1290 ; Subrout4}ine - Set pointer to user buffer1300 ;1310 SETBUF1320 LDA DBUFLO Move from DCB to zero page1330 STA BUFRLO1340 5} LDA DBUFLO+11350 STA BUFRLO+11360 RTS 1370 ;1380 ; Subroutine - Prepare to access sector of ramdisk1390 ;145}00 SETSEC1410 LDA #DENSITY1420 STA SECLEN Set sector length1430 LDA DAUX1+1 Check sector #1440 BNE NOTZ5}1450 LDA DAUX11460 BEQ OUTRG Sector 0 invalid1470 CMP #41480 BCS INRNG1490 LDA #$80 Sectors 1-3 5}always 128 bytes long1500 STA SECLEN1510 BNE INRNG1520 OUTRG1530 JMP NAKRET Sector # out of range1540 NOTZ5}1550 CMP #2 Check for sector # > $2D01560 BCC INRNG1570 BNE OUTRG1580 LDA #$D01590 CMP DAUX11605}0 BCC OUTRG1610 INRNG1620 LDA DAUX1 Sector # valid1630 LDY DAUX1+11640 LDX #$FF1650 DIV1211660 IN5}X Divide # by 121 - Result is bank #, remainder is page #1670 SEC 1680 SBC #1211690 BCS NOBOR1700 5} DEY 1710 NOBOR1720 CPY #$FF1730 BNE DIV1211740 AND #$7F Remainder+71750 ;1760 ; Subroutine - Prepare to5} switch banks:1770 ; X is bank #, A is page #1780 ;1790 SETBNK1800 STA ZP Save page #1810 LDA PORTB1820 5 } STA PBN Normal bank1830 AND #$8F1840 STA PB Bank 01850 TXA 1860 ASL A1870 ASL A1880 5 }ASL A1890 ASL A1900 ORA PB1910 STA PB Bank X1920 LDA $FFFA NMI vector1930 STA ZTEMP1940 5 }LDA $FFFB1950 STA ZTEMP+11960 LDY #01970 LDA #$40 RTI opcode1980 SEI Disable IRQ1990 STA 5 }(ZTEMP),Y Place RTI in NMI routine - disables NMI2000 LDA PB2010 STA PORTB Switch bank in2020 TYA 2030 5 }STA 0 Set up zero-page pointer2040 LDA ZP2050 STA 12060 LDA PBN2070 STA PORTB Switch normal bank 5}back in2080 RTS Leave 0 in Y, bank # in X2090 ;2100 ; Format routine2110 ;2120 FORMAT2130 LDX #5 C5}lear banks 0 to 52140 CLOOP12150 LDA #2 Clear page 2 and up2160 JSR SETBNK Prepare for switch2170 LDA P5}B2180 STA PORTB Switch bank in2190 TYA 2200 CLOOP22210 STA (0),Y Zero entire page2220 INY 2230 5}BNE CLOOP22240 INC 1 Next page2250 BPL CLOOP22260 LDA PBN2270 STA PORTB Switch bank out2280 5}LDA NMI2290 STA (ZTEMP),Y Enable interrupts2300 CLI 2310 DEX Next bank2320 BPL CLOOP12330 JS5}R SETBUF2340 LDA #$FF Return a sector with 2 $FFs and the rest 0s2350 LDY #02360 FLOOP2370 CPY #22380 5} BNE NOTFF2390 LDA #02400 NOTFF2410 STA (BUFRLO),Y2420 INY 2430 CPY SECLEN2440 BNE FLOOP2450 J5}MP SUCRET Done2460 ;2470 ; Write sector routine2480 ;2490 PUTSEC2500 JSR SETBUF2510 LDA #02520 STA CHKSUM5} Zero checksum2530 JSR SETSEC Point to ramdisk sector2540 PLOOP2550 LDA (BUFRLO),Y Get byte from user's buffer25}560 LDX PB2570 STX PORTB Switch bank2580 STA (0),Y Put byte into ramdisk2590 LDX PBN2600 STX PORT5}B Normal bank2610 CLC 2620 ADC CHKSUM Add byte to checksum2630 STA CHKSUM2640 INY Next byte265}50 CPY SECLEN Proper sector length2660 BNE PLOOP2670 LDX #0 Bank 0 holds checksum table2680 LDA DAUX5}1+12690 CLC 2700 ADC #2 Sector # indexes checksum table2710 JSR SETBNK2720 LDY DAUX12730 LDA CH5}KSUM2740 LDX PB2750 STX PORTB Switch bank2760 STA (0),Y Store checksum2770 LDX PBN2780 STX PORTB5} Normal bank2790 LDY #02800 LDA NMI2810 STA (ZTEMP),Y Enable interrupts2820 CLI 2830 JMP SUCRET D5}one2840 ;2850 ; Read sector routine2860 ;2870 GETSEC2880 JSR SETBUF2890 LDA #02900 STA CHKSUM Zero checks5}um2910 JSR SETSEC2920 GLOOP2930 LDX PB2940 STX PORTB Switch bank2950 LDA (0),Y Get byte from ramdisk5}2960 LDX PBN2970 STX PORTB Normal bank2980 STA (BUFRLO),Y Put byte into user's buffer2990 CLC 3000 5 } ADC CHKSUM Add to checksum3010 STA CHKSUM3020 INY Next byte3030 CPY SECLEN Proper sector length3045!}0 BNE GLOOP3050 LDX #0 Bank 0 for checksum table3060 LDA DAUX1+13070 CLC 3080 ADC #23090 JS5"}R SETBNK3100 LDY DAUX13110 LDX PB3120 STX PORTB Switch bank3130 LDA (0),Y Get original checksum3140 5#} LDX PBN3150 STX PORTB Normal bank3160 TAX 3170 LDY #03180 LDA NMI3190 STA (ZTEMP),Y Enable int5$}errupts3200 CLI 3210 CPX CHKSUM Compare checksums3220 BEQ GCSOK3230 JMP ERRRET If different, bad sector5%}3240 GCSOK3250 JMP SUCRET If same, done3260 ;3270 ; Read status routine3280 ;3290 STATUS3300 JSR SETBUF3310 5&} LDY #4 Return 4 bytes3320 LDA #0 All 0s3330 SLOOP3340 DEY 3350 BEQ STEND3360 STA (BUFRLO),5'}Y3370 JMP SLOOP3380 STEND3390 FLAG = DENSITY/43400 LDA #$20-FLAG3410 STA (BUFRLO),Y First byte tells densit5(}y of drive3420 JMP SUCRET Done3430 ;3440 ; Variable storage area3450 ;3460 ZP *= *+1 Holds page # in ramdisk 5)}to be accessed3470 PB *= *+1 Value of memory control register for selected bank3480 PBN *= *+1 Value of memory c5*}ontrol register for normal bank3490 NMI *= *+1 First opcode in NMI routine - Used to restore NMI3500 SECLEN *= *+1 L5+}ength of current sector3510 ;3520 ; RESET initialization routine3530 ;3540 *= $0100 Hidden (hopefully)3550 NEWINI5,}3560 DEC PORTB Enable RAM OS3570 OLDINI = *+13580 JSR * Call original DOSINI routine3590 MODINI3600 5-}LDA #NEWINI&$FF Set hook for next RESET3610 STA DOSINI3620 LDA #NEWINI/$01003630 STA DOSINI+13640 RTS 365.}50 ;3660 ; Load-time code - Install ramdisk3670 ;3680 *= $40003690 DO3700 LDA $E45A Save original SIO vector5/}3710 STA OLDVEC3720 LDA $E45B3730 STA OLDVEC+13740 LDA #HOOK&$FF Install new SIO vector3750 STA $E45A50}3760 LDA #HOOK/$01003770 STA $E45B3780 LDA $FFFA Save first opcode in NMI routine3790 STA $CB3800 51}LDA $FFFB3810 STA $CC3820 LDY #03830 LDA ($CB),Y3840 STA NMI3850 LDA DOSINI Save original DOSINI ve52}ctor3860 STA OLDINI3870 LDA DOSINI+13880 STA OLDINI+13890 JSR MODINI Install new one3900 JSR $07E0 53} Re-initialize FMS to show ramdisk present3910 RTS Done3920 *= $02E23930 .WORD DO Execute final l54}oad-time codee FMS to show ramdisk present3910 RTS Done3920 *= $02E23930 .WORD DO Execute final l4@8@ ө̩xԨӑө@X`@m3L ̺!LPLRLkSLW96}Lͮ```23`ͭ   L8   8y)ͭӍ)͊ 97} ͍ͭ45@x4͍Ә͍ͅ` ̭͍Ә͍ͭ͑4X V̩2LL V̩1 a̱298}͎ӑ͎e11 i ̬ 1͎ӑ͎Ӡ͑4XLL V̩1 a̮͎ӱ͎ӑ2e11 i ̬ ͎ӱ99}͎Ӫ͑4X1LBLL V̠2Lͩ 2LL   `@7@Z ̭[ ̩Z̍[˭̠ˍͥ    `9:}@͑4X1LBLL V̠2Lͩ 2LL   `@7@Z ̭[ ̩Z̍[˭̠ˍͥ    `80100 ; RAMDISK CONTROLLER FOR 256K ATARI 800XL0110 ; by Claus Buchholz, Dec., 19840120 ;0130 ; OPTIONS: Drive # and densit=<}y0140 ;0150 DRIVE = 20160 DENSITY = SINGLE0170 ;0180 ; Equates0190 ;0200 SINGLE = $80 Sector lengths0210 DOUBLE = ==}$000220 DDEVIC = $0300 SIO Device Control Block0230 DUNIT = $03010240 DCOMND = $03020250 DSTATS = $03030260 DBUFLO = $0=>}3040270 DBYTLO = $03080280 DAUX1 = $030A0290 DOSINI = $0C Access to RESET initialization0300 CHKSUM = $31 Temporary=?} checksum0310 BUFRLO = $32 Temporary pointer to user's buffer0320 ZTEMP = $34 Temporary miscellaneous use0330 STACK=@}P = $0318 Stack pointer save0340 PORTB = $D301 PIA port B - memory control register0350 ;0360 ; Load-time code - Copy O=A}S into RAM0370 ;0380 *= $40000390 GO0400 LDA PORTB Enable OS ROM0410 ORA #10420 STA PORTB0430 L=B}DA #$C0 Zero page pointer0440 STA $CC0450 LDA #00460 STA $CB0470 SEI Disable interrupts0480 =C} STA $D40E0490 TAY 0500 LOOP0510 LDA ($CB),Y Copy OS0520 DEC PORTB Enable RAM0530 STA ($CB),Y0540 =D} INC PORTB Enable ROM0550 INY 0560 BNE LOOP0570 LDX $CC0580 CPX #$CB Skip pages $CC to $D70590 =E} BNE NXPG0600 LDX #$D70610 NXPG0620 INX 0630 STX $CC0640 BNE LOOP0650 DEC PORTB Enable RAM0660 =F} LDA #$40 Enable interrupts0670 STA $D40E0680 CLI 0690 RTS Continue load0700 *= $02E20710=G} .WORD GO Execute preliminary load-time code0720 ;0730 ; Ramdisk controller code0740 ;0750 *= $CC00 Permane=H}nt code - in place of alt. char. set0760 HOOK0770 CLC Hook into all SIO calls0780 LDA DDEVIC0790 ADC =I}DUNIT0800 CMP #$31+DRIVE Right drive number?0810 BEQ HOOKED0820 OLDVEC = *+10830 JMP * If not, go to SI=J}O0840 HOOKED0850 TSX If so, intercept0860 STX STACKP Save stack pointer0870 LDA DCOMND Examine comm=K}and0880 CMP #'! Format?0890 BNE NOFMT0900 JMP FORMAT0910 NOFMT0920 CMP #'P Put sector?0930 =L}BNE NOPUT0940 JMP PUTSEC0950 NOPUT0960 CMP #'R Read sector?0970 BNE NOGET0980 JMP GETSEC0990 NOGET=M}1000 CMP #'S Read status?1010 BNE NOSTT1020 JMP STATUS1030 NOSTT1040 CMP #'W Write sector?1050 =N} BNE NAKRET1060 JMP PUTSEC1070 ;1080 ; Returns - Restore stack pointer, report error status and return1090 ;1100 N=O}AKRET1110 LDX STACKP1120 TXS 1130 LDY #139 NAK error for improper command1140 STY DSTATS1150 RTS =P}1160 ERRRET1170 LDX STACKP1180 TXS 1190 LDY #144 Bad sector error1200 STY DSTATS1210 RTS 1220 S=Q}UCRET1230 LDX STACKP1240 TXS 1250 LDY #1 No error1260 STY DSTATS1270 RTS 1280 ;1290 ; Subrout=R}ine - Set pointer to user buffer1300 ;1310 SETBUF1320 LDA DBUFLO Move from DCB to zero page1330 STA BUFRLO1340 =S} LDA DBUFLO+11350 STA BUFRLO+11360 RTS 1370 ;1380 ; Subroutine - Prepare to access sector of ramdisk1390 ;14=T}00 SETSEC1410 LDA #DENSITY1420 STA SECLEN Set sector length1430 LDA DAUX1+1 Check sector #1440 BNE NOTZ=U}1450 LDA DAUX11460 BEQ OUTRG Sector 0 invalid1470 CMP #41480 BCS INRNG1490 LDA #$80 Sectors 1-3 =V}always 128 bytes long1500 STA SECLEN1510 BNE INRNG1520 OUTRG1530 JMP NAKRET Sector # out of range1540 NOTZ=W}1550 CMP #2 Check for sector # > $2D01560 BCC INRNG1570 BNE OUTRG1580 LDA #$D01590 CMP DAUX1160=X}0 BCC OUTRG1610 INRNG1620 LDA DAUX1 Sector # valid1630 LDY DAUX1+11640 LDX #$FF1650 DIV1211660 IN=Y}X Divide # by 121 - Result is bank #, remainder is page #1670 SEC 1680 SBC #1211690 BCS NOBOR1700 =Z} DEY 1710 NOBOR1720 CPY #$FF1730 BNE DIV1211740 AND #$7F Remainder+71750 ;1760 ; Subroutine - Prepare to=[} switch banks:1770 ; X is bank #, A is page #1780 ;1790 SETBNK1800 STA ZP Save page #1810 LDA PORTB1820 =\} STA PBN Normal bank1830 AND #$8F1840 STA PB Bank 01850 TXA 1860 ASL A1870 ASL A1880 =]}ASL A1890 ASL A1900 ORA PB1910 STA PB Bank X1920 LDA $FFFA NMI vector1930 STA ZTEMP1940 =^}LDA $FFFB1950 STA ZTEMP+11960 LDY #01970 LDA #$40 RTI opcode1980 SEI Disable IRQ1990 STA =_}(ZTEMP),Y Place RTI in NMI routine - disables NMI2000 LDA PB2010 STA PORTB Switch bank in2020 TYA 2030 =`}STA 0 Set up zero-page pointer2040 LDA ZP2050 STA 12060 LDA PBN2070 STA PORTB Switch normal bank =a}back in2080 RTS Leave 0 in Y, bank # in X2090 ;2100 ; Format routine2110 ;2120 FORMAT2130 LDX #5 C=b}lear banks 0 to 52140 CLOOP12150 LDA #2 Clear page 2 and up2160 JSR SETBNK Prepare for switch2170 LDA P=c}B2180 STA PORTB Switch bank in2190 TYA 2200 CLOOP22210 STA (0),Y Zero entire page2220 INY 2230 =d}BNE CLOOP22240 INC 1 Next page2250 BPL CLOOP22260 LDA PBN2270 STA PORTB Switch bank out2280 =e}LDA NMI2290 STA (ZTEMP),Y Enable interrupts2300 CLI 2310 DEX Next bank2320 BPL CLOOP12330 JS=f}R SETBUF2340 LDA #$FF Return a sector with 2 $FFs and the rest 0s2350 LDY #02360 FLOOP2370 CPY #22380 =g} BNE NOTFF2390 LDA #02400 NOTFF2410 STA (BUFRLO),Y2420 INY 2430 CPY SECLEN2440 BNE FLOOP2450 J=q}?B:DIA1050 B >RAMDISK COMBGRAMS BINBLRAM2S BINBRRAMDD BINB XRAMDSK 256B(eGENEMDE2 B ADRCHECK B ERRCHECK B3XLDSK SRCBXLDSK OBJBRD DOCBRDS OBJBMRD SRCB5RDD OBJBM;RD2 SRCMP SUCRET Done2460 ;2470 ; Write sector routine2480 ;2490 PUTSEC2500 JSR SETBUF2510 LDA #02520 STA CHKSUM=r} Zero checksum2530 JSR SETSEC Point to ramdisk sector2540 PLOOP2550 LDA (BUFRLO),Y Get byte from user's buffer2=s}560 LDX PB2570 STX PORTB Switch bank2580 STA (0),Y Put byte into ramdisk2590 LDX PBN2600 STX PORT=t}B Normal bank2610 CLC 2620 ADC CHKSUM Add byte to checksum2630 STA CHKSUM2640 INY Next byte26=u}50 CPY SECLEN Proper sector length2660 BNE PLOOP2670 LDX #0 Bank 0 holds checksum table2680 LDA DAUX=v}1+12690 CLC 2700 ADC #2 Sector # indexes checksum table2710 JSR SETBNK2720 LDY DAUX12730 LDA CH=w}KSUM2740 LDX PB2750 STX PORTB Switch bank2760 STA (0),Y Store checksum2770 LDX PBN2780 STX PORTB=x} Normal bank2790 LDY #02800 LDA NMI2810 STA (ZTEMP),Y Enable interrupts2820 CLI 2830 JMP SUCRET D=y}one2840 ;2850 ; Read sector routine2860 ;2870 GETSEC2880 JSR SETBUF2890 LDA #02900 STA CHKSUM Zero checks=z}um2910 JSR SETSEC2920 GLOOP2930 LDX PB2940 STX PORTB Switch bank2950 LDA (0),Y Get byte from ramdisk={}2960 LDX PBN2970 STX PORTB Normal bank2980 STA (BUFRLO),Y Put byte into user's buffer2990 CLC 3000 =|} ADC CHKSUM Add to checksum3010 STA CHKSUM3020 INY Next byte3030 CPY SECLEN Proper sector length304=}}0 BNE GLOOP3050 LDX #0 Bank 0 for checksum table3060 LDA DAUX1+13070 CLC 3080 ADC #23090 JS=~}R SETBNK3100 LDY DAUX13110 LDX PB3120 STX PORTB Switch bank3130 LDA (0),Y Get original checksum3140 =} LDX PBN3150 STX PORTB Normal bank3160 TAX 3170 LDY #03180 LDA NMI3190 STA (ZTEMP),Y Enable int=}errupts3200 CLI 3210 CPX CHKSUM Compare checksums3220 BEQ GCSOK3230 JMP ERRRET If different, bad sector=}3240 GCSOK3250 JMP SUCRET If same, done3260 ;3270 ; Read status routine3280 ;3290 STATUS3300 JSR SETBUF3310 =} LDY #4 Return 4 bytes3320 LDA #0 All 0s3330 SLOOP3340 DEY 3350 BEQ STEND3360 STA (BUFRLO),=}Y3370 JMP SLOOP3380 STEND3390 FLAG = DENSITY/43400 LDA #$20-FLAG3410 STA (BUFRLO),Y First byte tells densit=}y of drive3420 JMP SUCRET Done3430 ;3440 ; Variable storage area3450 ;3460 ZP *= *+1 Holds page # in ramdisk =}to be accessed3470 PB *= *+1 Value of memory control register for selected bank3480 PBN *= *+1 Value of memory c=}ontrol register for normal bank3490 NMI *= *+1 First opcode in NMI routine - Used to restore NMI3500 SECLEN *= *+1 L=}ength of current sector3510 ;3520 ; RESET initialization routine3530 ;3540 *= $0100 Hidden (hopefully)3550 NEWINI=}3560 DEC PORTB Enable RAM OS3570 OLDINI = *+13580 JSR * Call original DOSINI routine3590 MODINI3600 =}LDA #NEWINI&$FF Set hook for next RESET3610 STA DOSINI3620 LDA #NEWINI/$01003630 STA DOSINI+13640 RTS 36=}50 ;3660 ; Load-time code - Install ramdisk3670 ;3680 *= $40003690 DO3700 LDA $E45A Save original SIO vector=}3710 STA OLDVEC3720 LDA $E45B3730 STA OLDVEC+13740 LDA #HOOK&$FF Install new SIO vector3750 STA $E45A=}3760 LDA #HOOK/$01003770 STA $E45B3780 LDA $FFFA Save first opcode in NMI routine3790 STA $CB3800 =}LDA $FFFB3810 STA $CC3820 LDY #03830 LDA ($CB),Y3840 STA NMI3850 LDA DOSINI Save original DOSINI ve=}ctor3860 STA OLDINI3870 LDA DOSINI+13880 STA OLDINI+13890 JSR MODINI Install new one3900 JSR $07E0 =} Re-initialize FMS to show ramdisk present3910 RTS Done3920 *= $02E23930 .WORD DO Execute final l=}oad-time codee FMS to show ramdisk present3910 RTS Done3920 *= $02E23930 .WORD DO Execute final l<